Objects provide a way for programmers to extend the basic data types in a programming language to provide higher-level data types specific to their application. Objects are also used to package specific tools or capabilities, such as graphical packages or mathematical packages, so that they can be used effectively in larger applications. Objects typically consist of properties or members, which hold data from the basic data types, and may also contain other objects, and methods, functions designed to work specifically on a particular object. Often, Object Oriented Languages (OOLs) will provide a way of overloading the basic operations of the language, including addition, subtraction, multiplication, division, assignment, subscripting, and field reference. Typically, this is done by providing special methods that get invoked when these operators are used on members of the class. For example, if x and y are members of a class C, then if the user writes
x+y
the class system might invoke the overloaded
Plus (x, y)
in response to the ‘+’ operator in order to compute the “sum” of x and y. The Plus function will typically perform some other operations extending, or in place of, the addition operation.” (there would be no reason to overload the ‘+’ operator if all that was going to happen was an ordinary addition of the two variables).
Unfortunately, there are many cases when the traditional operator overloading method does not meet user needs. For example, people writing code for an embedded processor frequently must simulate the behavior of computers with unusual instructions and word lengths. Also, speed of execution is frequently critical, so simulating complicated instructions when simple instructions will do is not an acceptable alternative. Finally, programmers may desire more control over the order of operations than is provided by the base language.
Additionally, in conventional object-oriented languages, operator overloading is specified by defining methods in the class that correspond to the operators that are being overloaded. This specification suffers from the deficiencies that the objects that participate in an expression are only processed in pairs, and that there is no opportunity to discover the context in which a given expression appears. As an example, consider
y=x+1
If x is a 16-bit variable, but y is only 8 bits wide, then the addition can be done in 8 bits rather than 16. However, the conventional overloading method does not allow information from the left side of the assignment operator to be seen on the right side—the only thing that the overloaded Plus operator sees is x and 1. Put another way, the context in which the operation is occurring is not visible during the mathematical operation.
An additional problem with conventional methods of overloading operators is that the conventional methods have difficulty with complicated instructions. An example is given by
x+y*Z
Some embedded processors have special instructions that will multiply two numbers and add the result into a third (a multiply and accumulate or MAC instruction). It is very difficult in the usual operator overloading paradigms that operate on two operands to recognize and properly simulate MAC instructions.